# !/usr/bin/env python
# -*-coding:utf-8 -*-

"""
# Author     ：skyTree
# version    ：python 3.11
# Description：自定义中间件
"""

import re

from django.http import HttpResponse
from django.utils.deprecation import MiddlewareMixin


# 中间件就是一个类，继承父类MiddlewareMixin，重写最多的5个方法
# 就是你可以重写一个或者多个方法
class IpMiddleware(MiddlewareMixin):
    visit_times = {}

    def process_request(self, request):
        # 执行路由之前被调用，返回None就是通过，返回HttpResponse  就是拦截成功
        print("执行路由之前被调用")

        # 获取远程客户端的ip地址
        IPAddr = request.META['REMOTE_ADDR']
        # 获取请求的路由的地址
        pathinfo = request.path_info
        print(IPAddr)  # 127.0.0.1
        print(pathinfo)  # /test/

        # if not re.match('^/88888',pathinfo):
        #     #  如果没有匹配到
        #     return
        # # 拿到现在的访问次数
        # times = self.visit_times.get(IPAddr,0)
        #
        # self.visit_times[IPAddr] = times+1
        #
        # if times<5:
        #     return
        # return HttpResponse("您已经访问了"+str(times)+"次，访问被禁止")

    def process_view(self, request, view_func, view_func_args, view_func_kwargs):
        # 调用视图函数之前被调用，返回None就是通过，返回HttpResponse  就是拦截成功
        print("调用视图函数之前被调用")
        return None

    def process_response(self, request, response):
        # 所有的响应返回给浏览器之前被调用,返回HttpResponse
        # 一定会走这个逻辑，即使view里面代码错了，先走错的，再走这个

        # 执行路由之前被调用
        # 调用视图函数之前被调用
        # 我出错了
        # 返回给浏览器之前，调用我了
        print("返回给浏览器之前，调用我了")
        return response

    # def process_template_response(self, request, response):
    #     # 很少用
    #     # 只有我们的视图里面返回了render渲染的，才会走这个
    #     print("我走了render函数了")
    #     return None

    def process_exception(self, request, exception):
        # 视图里面出错了，就会自动到这个里面执行，返回HttpResponse
        # 抓异常，发邮件
        print("我出错了")
        return None
